package com.chenu.gamscriptman.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

@Data
@Accessors(chain = true)
@TableName(value = "userdata")
@ApiModel(value = "用户数据", description = "封装一个用户数据")    /* 这是一个API调用需要用到的参数 */
public class UserData {

    @TableId(type = IdType.AUTO, value = "id")
    @ApiModelProperty(value = "id", name = "id", required = false, dataType = "long", example = "3")
    private Long id;

    @TableField(value = "game_name")
    @ApiModelProperty(value = "指出用户数据来源于什么游戏", name = "gameName", required = false,
            dataType = "string", example = "一起来捉妖")
    private String gameName;            /* 该用户数据来自什么游戏 */

    @TableField(value = "data")
    @ApiModelProperty(value = "数据信息，由用户自定义的映射决定，以json字符串格式存放", name = "data", required = false,
            dataType = "string", example = "{\"addr\": \"上海\"}")
    private String data;                /* 游戏数据，以一个json字符串存放，必须key:value一对。 */
    @TableField(exist = false)
    @ApiModelProperty(hidden = true)
    private Map<String, String> resourceDataMap;    /* 以上用户数据解析完后的实体类 */

    @TableField(value = "uptime")
    @ApiModelProperty(value = "用户数据更新时间（时间戳形式），不必手动填写，由系统自动检测生成",
            name = "uptime", required = false , dataType = "long", example = "1577455110")
    private Long uptime;                /* 数据更新时间，使用时间戳存放，便于排序 */

    @TableField(value = "admin_fk")
    @ApiModelProperty(hidden = true)
    private Long adminFk;               /* 谁更新的这条数据，外键，指向一个用户 */

    /* 外键映射 */
    @TableField(exist = false)
    @ApiModelProperty(hidden = true)
    private User admin;

    /* 用户需要的数据，它们跟表中稍有不同 */
    @TableField(exist = false)
    @ApiModelProperty(value = "用户数据的管理员（用户名），不必手动填写，由系统自动检测生成",
            name = "adminUsername", required = false, dataType = "string", example = "root")
    private String adminUsername;   /* 用户看不懂外键，他需要知道管理员的用户名是什么 */

    /* 给用户的json数据需要忽略的字段 */
    public static List<String> ignoreAttr = Arrays.asList(
            "adminFk", "admin", "devNrEnd", "rule"
    );

    /* 额外的查询条件封装 */
    @TableField(exist = false)
    private GameTask gameTask;      /* 用于确定一个用户数据 */
    @TableField(exist = false)
    @ApiModelProperty(hidden = true)
    Long devNrEnd;                /* 设备编号结束 */
    @TableField(exist = false)
    @ApiModelProperty(hidden = true)
    String rule;                    /* 自定义查询规则，里面的字段都来源于自定义的字段 */
//    @TableField(exist = false)
//    Integer sortBy;                 /* 排序方式 */
//    public static final int SORT_BY_UPTIME = 0;     /* 通过更新时间排序 */
//    public static final int SORT_BY_VIRASSET = 1;   /* 通过虚拟资产排序 */
//    public static final int SORT_BY_LEVEL = 2;      /* 通过游戏等级排序 */


}